//导入用户表的规则
const userModel = require('../db/user')
//导入日志报错
const writeErr = require('../utils/writeErr')
//导入加密模块
const bcryptjs = require('bcryptjs')
//导入path路径模块
const path = require('path')
//导入fs模块
const fs = require('fs')
//导入响应的工具库
const xy = require('../utils/xy')
//导入令牌模块
const jwt = require('jsonwebtoken')


//导出
module.exports = {
    //获取用户信息
    async getinfo(req, resp) {
        //获取传递的用户id  在表头获取id
        let {
            userId
        } = req.params //获取表头的数值
        //根据用户id获取用户其他信息
        //用promise修改数据库操作
        try {
            let docs = await userModel.findOne({
                _id: userId
            })
            if (!docs) {
                //没有查询到值  返回报错
                xy(resp, 405, '用户id有错误')
                return
            }
            //查到了  返回其它值
            xy(resp, 200, '查询成功', {
                username: docs.username,
                email: docs.email,
                tel: docs.tel,
                createdAt: +new Date(docs.createdAt),
                updatedAt: +new Date(docs.updatedAt)
            })
        } catch (err) {
            //有错误  返回报错
            writeErr(err)
            xy(resp, 501, '系统繁忙,稍后再试')
        }
    },
    //用户登录
    async login(req, resp) {
        //获取一下提交的数据
        let {
            username,
            password
        } = req.body
        //判断一下获没获取到
        if (!username || !password) {
            //没获取到 报错
            xy(resp, 401, '数据不能为空')
            return
        }
        //在数据库中查找有没有一样的名称
        //用promise修改登录
        try {
            let docs = await userModel.findOne({
                username
            })
            if (!docs) {
                //没找到 代表 用户名错误
                xy(resp, 403, '用户名或密码错误')
                return
            }
            //判断密码一不一样
            if (!bcryptjs.compareSync(password, docs.password)) {
                //不一样的话 错误
                xy(resp, 403, '用户名或密码错误')
                return
            }
            //拼接加密盐所在的文件路径
            let configFilePath = path.join(__dirname, '../', 'config', 'config.json')
            //读取配置中的盐
            let salt = JSON.parse(fs.readFileSync(configFilePath, 'utf-8')).tokenSalt
            xy(resp, 200, '登陆成功', {
                token: jwt.sign({
                    userId: docs._id,
                    username: docs.username,
                    startTime: +new Date(),
                    express: 7200 * 1000
                }, salt),
                userId: docs._id,
                username: docs.username
            })
        } catch (err) {
            writeErr(err)
            xy(resp, 501, '系统繁忙,稍后再试')
        }
    },
    //用户注册
    async register(req, resp) {
        //获取提交的数据
        let {
            username,
            password,
            email,
            tel
        } = req.body
        //判断一下 获没获取到值
        if (!username || !password || !email || !tel) {
            //没获取到值
            xy(resp, 401, '数据不能为空')
            return
        }
        //在库中查询名称  有没有一样的
        //用promise
        try {
            let docs = await userModel.findOne({
                username
            })
            if (docs) {
                xy(resp, 402, '用户名被占用')
                return
            }
            try {
                docs = await userModel.insertMany({
                    //对象简写
                    username,
                    password: bcryptjs.hashSync(password, 10),
                    email,
                    tel
                })
                xy(resp, 200, '注册成功')
            } catch (err) {
                writeErr(err)
                xy(resp, 502, '系统繁忙,稍后再试')
            }
        } catch (err) {
            writeErr(err)
            xy(resp, 502, '系统繁忙,稍后再试')
        }
    }
}